/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.bodylimit.service;

import br.com.bodylimit.dao.FuncionarioDAO;
import br.com.bodylimit.dao.DAOFactory;
import br.com.bodylimit.model.Funcionario;
import br.com.bodylimit.util.ConnectionFactory;
import java.sql.SQLException;
import br.com.bodylimit.util.Mensagem;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.util.List;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

/**
 *
 * @author Allan
 */
public class FuncionarioService
{
    Connection con;
    FuncionarioDAO dao;

    static final Logger logger = Logger.getLogger("br.com.bodylimit.service");

    static {
        logger.setLevel(Level.ALL);
        try {
            FileHandler fh = new FileHandler("logs" + File.separator + "FuncionarioService.log");
            fh.setFormatter(new SimpleFormatter());
            logger.addHandler(fh);
        } catch(IOException ex) {
            logger.severe("Nao foi possivel criar arquivo de log!");
            ex.printStackTrace();
        }
    }

    public FuncionarioService() {


    }


    /**
     * Adciona um funcionario a base de dados
     * @param funcionario a ser adcionado
     * @return true se o funcionario foi adcionado
     */
    public boolean adcionar(Funcionario funcionario)
    {       
        try
        {
            con = new ConnectionFactory().getConnection();
            dao = new DAOFactory().getFuncionarioDAO(con);

            dao.adcionar(funcionario);

            con.close();

            return true;
        } 
        catch (SQLException ex)
        {
            Mensagem.msgErro("Erro ao adcionar funcionario!");
            logger.warning(ex.getMessage());

            try
            {
                con.close();
            } 
            catch (SQLException ex1)
            {
            }

            return false;
        }
    }

    /**
     * Obtem um funcionario da base de dados pelo numero de sua matricula.
     * @param matricula
     * @return
     */
    public Funcionario obter(int matricula)
    {
        Funcionario funcionario = null;

        try
        {
            con = new ConnectionFactory().getConnection();
            dao = new DAOFactory().getFuncionarioDAO(con);

            funcionario = dao.obter(matricula);

            con.close();

            return funcionario;
        } 
        catch (SQLException ex)
        {
            Mensagem.msgErro("Erro ao obter funcionario!\n" + ex.getMessage());
            logger.warning(ex.getMessage());

            try
            {
                con.close();
            } 
            catch (SQLException ex1)
            {
            }

            return null;
        }
    }

    public List<Funcionario> listar()
    {
        List<Funcionario> funcionarios = null;

        try
        {
            con = new ConnectionFactory().getConnection();
            dao = new DAOFactory().getFuncionarioDAO(con);

            funcionarios = dao.listar();

            con.close();

            return funcionarios;
        } 
        catch (SQLException ex)
        {
            Mensagem.msgErro("Erro ao lsitar funcionarios!\n" + ex.getMessage());
            logger.warning(ex.getMessage());

            try
            {
                con.close();
            } 
            catch (SQLException ex1)
            {
            }

            return null;
        }
    }

    public List<Funcionario> listarPorNome(String nome)
    {
        List<Funcionario> funcionarios = null;

        try
        {
            con = new ConnectionFactory().getConnection();
            dao = new DAOFactory().getFuncionarioDAO(con);

            funcionarios = dao.listarPorNome(nome);

            con.close();

            return funcionarios;
        } 
        catch (SQLException ex)
        {
            Mensagem.msgErro("Erro ao listar funcionarios por nome!\n" + ex.getMessage());
            logger.warning(ex.getMessage());

            try
            {
                con.close();
            } 
            catch (SQLException ex1)
            {
            }

            return null;
        }
    }

    /**
     * Atualiza os dados de um funcionario na base de dados.
     * @param funcionario a ser adcionado
     * @return true se o funcionario foi adcionado
     */
    public boolean atualizar(Funcionario funcionario)
    {
        boolean retorno;

        try
        {
            con = new ConnectionFactory().getConnection();
            dao = new DAOFactory().getFuncionarioDAO(con);

            retorno = dao.atualizar(funcionario);

            con.close();

            return retorno;
        } 
        catch (SQLException ex)
        {
            Mensagem.msgErro("Erro ao atualizar funcionario!\n" + ex.getMessage());
            logger.warning(ex.getMessage());

            try
            {
                con.close();
            } 
            catch (SQLException ex1)
            {
            }

            return false;
        }
    }

    public boolean remover(int matricula)
    {
        try
        {
            con = new ConnectionFactory().getConnection();
            dao = new DAOFactory().getFuncionarioDAO(con);

            dao.remover(matricula);

            con.close();

            return true;
        } 
        catch (SQLException ex)
        {
            Mensagem.msgErro("Erro ao remover funcionario!\n" + ex.getMessage());
            logger.warning(ex.getMessage());

            try
            {
                con.close();
            } 
            catch (SQLException ex1)
            {
            }
            
            return false;
        }
    }
}